/**
 * @file security.h
 * @author yonglin_zhang & hang_li
 * @brief 对外暴露接口头文件
 * @version dev 0.1
 * @date 2023-07-21
 * 
 * @copyright Copyright (c) 2023
 * 
 */

#ifndef SECURITY_H
#define SECURITY_H

#include <stdlib.h>

#define DES_KEY_SIZE 8

typedef enum {
    ENCODE,
    DECODE,
}OP_TYPE;

// 填充算法
typedef enum {
    PADDING_NONE,       // 无填充
    PADDING_ZERO,       // 零填充
    PADDING_PKCS7,      // P7填充
    PADDING_ANSIX923,   // ANSI X.923填充
    PADDING_ISO10126,   // ISO 10126填充
    PADDING_BIT,        // 比特填充
    PADDING_SPACE,      // 空格填充
    PADDING_ISO7816     // ISO/IEC 7816 填充
}PADDING_ALGORITHM;

/**
 * @brief 内部测试接口
 * 
 */
void internal_test();

/**
 * @brief base64编码
 * 
 * @param out 输出buffer
 * @param olen 输出长度
 * @param osize buffer大小
 * @param in 输入字符串
 * @param inlen 输入长度
 * @return int 错误码
 */
int security_base64_encode(char out[], size_t *olen, size_t osize, char in[], size_t inlen);

/**
 * @brief base64解码
 * 
 * @param out 输出buffer
 * @param olen 输出长度
 * @param osize buffer大小
 * @param in 输入字符串
 * @param inlen 输入长度
 * @return int 错误码
 */
int security_base64_decode(char out[], size_t *olen, size_t osize, char in[], size_t inlen);

/**
 * @brief des加密，内部使用64位PKCS#7填充
 * 
 * @warning 为了保证填充，out的大小必须比in多出9字节
 * 
 * @param out 输出buffer
 * @param olen 输出长度
 * @param osize buffer大小
 * @param in 输入字符串
 * @param inlen 输入长度
 * @return int 错误码
 */
int security_des_encrypt(char out[], size_t *olen, size_t osize, char in[], size_t inlen, char key[DES_KEY_SIZE]);

/**
 * @brief des解密，内部使用64位PKCS#7填充
 * 
 * @param out 输出buffer
 * @param olen 输出长度
 * @param osize buffer大小
 * @param in 输入字符串
 * @param inlen 输入长度
 * @return int 错误码
 */
int security_des_decrypt(char out[], size_t *olen, size_t osize, char in[], size_t inlen, char key[DES_KEY_SIZE]);

/**
 * @brief des加密文件，内部使用64位PKCS#7填充
 * 
 * @param input_file 输入文件名，要包含路径
 * @param output_file 输出文件名，要包含路径
 * @param key 加密秘钥
 * @return int 
 */
int security_des_file_encrypt(const char *input_file, const char *output_file, char key[DES_KEY_SIZE]);

/**
 * @brief des解密文件，内部使用64位PKCS#7填充
 * 
 * @param input_file 输入文件名，要包含路径
 * @param output_file 输出文件名，要包含路径
 * @param key 加密秘钥
 * @return int 
 */
int security_des_file_decrypt(const char *input_file, const char *output_file, char key[DES_KEY_SIZE]);

// SECURITY_H
#endif